/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.hadoop.hive.serde2.io; import com.google.code.tempusfugit.concurrency.RepeatingRule; import com.google.code.tempusfugit.concurrency.annotations.Repeating; import org.apache.hadoop.hive.common.type.TimestampTZ; import org.apache.hadoop.io.WritableComparator; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import java.util.concurrent.ThreadLocalRandom; public class TestTimestampTZWritable { @Rule public RepeatingRule repeatingRule = new RepeatingRule(); @Test @Repeating(repetition = 10) public void testSeconds() { // just 1 VInt long seconds = ThreadLocalRandom.current().nextLong(Integer.MAX_VALUE); TimestampTZ tstz = new TimestampTZ(seconds, 0); verifyConversion(tstz); // 2 VInt seconds = ThreadLocalRandom.current().nextLong(Integer.MAX_VALUE) + Integer.MAX_VALUE + 1; if (ThreadLocalRandom.current().nextBoolean()) { seconds = -seconds; } tstz.set(seconds, 0); verifyConversion(tstz); } @Test @Repeating(repetition = 10) public void testSecondsWithNanos() { long seconds = ThreadLocalRandom.current().nextLong(31556889864403199L); if (ThreadLocalRandom.current().nextBoolean()) { seconds = -seconds; } int nanos = ThreadLocalRandom.current().nextInt(999999999) + 1; TimestampTZ tstz = new TimestampTZ(seconds, nanos); verifyConversion(tstz); } @Test public void testComparison() { String s1 = "2017-04-14 18:00:00 Asia/Shanghai"; String s2 = "2017-04-14 10:00:00.00 GMT"; String s3 = "2017-04-14 18:00:00 UTC+08:00"; String s4 = "2017-04-14 18:00:00 Europe/London"; TimestampTZWritable writable1 = new TimestampTZWritable(TimestampTZ.parse(s1)); TimestampTZWritable writable2 = new TimestampTZWritable(TimestampTZ.parse(s2)); TimestampTZWritable writable3 = new TimestampTZWritable(TimestampTZ.parse(s3)); TimestampTZWritable writable4 = new TimestampTZWritable(TimestampTZ.parse(s4)); Assert.assertEquals(writable1, writable2); Assert.assertEquals(writable1, writable3); Assert.assertEquals(writable1.hashCode(), writable2.hashCode()); Assert.assertEquals(writable1.hashCode(), writable3.hashCode()); Assert.assertTrue(writable1.compareTo(writable4) < 0); byte[] bs1 = writable1.toBinarySortable(); byte[] bs2 = writable2.toBinarySortable(); byte[] bs3 = writable3.toBinarySortable(); byte[] bs4 = writable4.toBinarySortable(); Assert.assertTrue(WritableComparator.compareBytes(bs1, 0, bs1.length, bs2, 0, bs2.length) == 0); Assert.assertTrue(WritableComparator.compareBytes(bs1, 0, bs1.length, bs3, 0, bs3.length) == 0); Assert.assertTrue(WritableComparator.compareBytes(bs1, 0, bs1.length, bs4, 0, bs4.length) < 0); } private static void verifyConversion(TimestampTZ srcTstz) { TimestampTZWritable src = new TimestampTZWritable(srcTstz); byte[] bytes = src.getBytes(); TimestampTZWritable dest = new TimestampTZWritable(bytes, 0); TimestampTZ destTstz = dest.getTimestampTZ(); String errMsg = "Src tstz with seconds " + srcTstz.getEpochSecond() + ", nanos " + srcTstz.getNanos() + ". Dest tstz with seconds " + destTstz.getEpochSecond() + ", nanos " + destTstz.getNanos(); Assert.assertEquals(errMsg, srcTstz, destTstz); } }